Bug 660730: Use GStatBuf for portability
authorChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 3 Oct 2011 15:25:33 +0000 (23:25 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Mon, 3 Oct 2011 15:25:33 +0000 (23:25 +0800)
Thanks to Kean Johnston for pointing this out.

There are a few places in GTK that use "struct stat",
and then g_stat(), rather than using GStatBuf.This breaks things on
Windows. Since the size of struct stat can vary depending on other
flags specified, this has the potential to cause overwrites and is
trivial to fix.

Based on patch submitted by Kean Johnston

gtk/gtkiconcache.c
gtk/gtkicontheme.c
gtk/gtkrecentmanager.c
gtk/updateiconcache.c

index ecaf6df1ea10fd1e169d496a97444eb2ac5b2696..855b270be467795d8e30c6dfdc704e5ae5a5b68f 100644 (file)
@@ -89,8 +89,8 @@ _gtk_icon_cache_new_for_path (const gchar *path)
 
   gchar *cache_filename;
   gint fd = -1;
-  struct stat st;
-  struct stat path_st;
+  GStatBuf st;
+  GStatBuf path_st;
   CacheInfo info;
 
    /* Check if we have a cache file */
@@ -107,7 +107,12 @@ _gtk_icon_cache_new_for_path (const gchar *path)
 
   if (fd < 0)
     goto done;
-  
+
+#ifdef G_OS_WIN32
+#undef fstat /* Just in case */
+#define fstat _fstat32  
+#endif
+
   if (fstat (fd, &st) < 0 || st.st_size < 4)
     goto done;
 
index cdebec327a5099572c9c7465653de643c0747225..5d90596f2337174c8a84de3f8009b7d8b141823c 100644 (file)
@@ -979,7 +979,7 @@ insert_theme (GtkIconTheme *icon_theme, const char *theme_name)
   GKeyFile *theme_file;
   GError *error = NULL;
   IconThemeDirMtime *dir_mtime;
-  struct stat stat_buf;
+  GStatBuf stat_buf;
   
   priv = icon_theme->priv;
 
@@ -1123,7 +1123,7 @@ load_themes (GtkIconTheme *icon_theme)
   IconSuffix old_suffix, new_suffix;
   GTimeVal tv;
   IconThemeDirMtime *dir_mtime;
-  struct stat stat_buf;
+  GStatBuf stat_buf;
   
   priv = icon_theme->priv;
 
@@ -1948,7 +1948,7 @@ rescan_themes (GtkIconTheme *icon_theme)
   IconThemeDirMtime *dir_mtime;
   GList *d;
   int stat_res;
-  struct stat stat_buf;
+  GStatBuf stat_buf;
   GTimeVal tv;
 
   priv = icon_theme->priv;
index dbe83fa975a321b00baa02d49809156b1ecd0509..5aadf3569226a43b2223abea4956b40a21a339a1 100644 (file)
@@ -2037,7 +2037,7 @@ gboolean
 gtk_recent_info_exists (GtkRecentInfo *info)
 {
   gchar *filename;
-  struct stat stat_buf;
+  GStatBuf stat_buf;
   gboolean retval = FALSE;
   
   g_return_val_if_fail (info != NULL, FALSE);
@@ -2049,7 +2049,7 @@ gtk_recent_info_exists (GtkRecentInfo *info)
   filename = g_filename_from_uri (info->uri, NULL, NULL);
   if (filename)
     {
-      if (stat (filename, &stat_buf) == 0)
+      if (g_stat (filename, &stat_buf) == 0)
         retval = TRUE;
      
       g_free (filename);
index ea5cbfeb5a171bf12dfb62b3854d622b4e3e4db1..6988215714e4fe0aa47ecd561dcc324128e2936f 100644 (file)
@@ -73,11 +73,11 @@ static gchar *var_name = "-";
 
 #include <ftw.h>
 
-static struct stat cache_stat;
+static GStatBuf cache_stat;
 static gboolean cache_up_to_date;
 
 static int check_dir_mtime (const char        *dir, 
-                            const struct stat *sb,
+                            const GStatBuf    *sb,
                             int                tf)
 {
   if (tf != FTW_NS && sb->st_mtime > cache_stat.st_mtime)
@@ -118,7 +118,7 @@ static int check_dir_mtime (const char        *dir,
 gboolean
 is_cache_up_to_date (const gchar *path)
 {
-  struct stat path_stat, cache_stat;
+  GStatBuf path_stat, cache_stat;
   gchar *cache_path;
   int retval; 
   
@@ -1455,7 +1455,7 @@ build_cache (const gchar *path)
 #endif
   GHashTable *files;
   FILE *cache;
-  struct stat path_stat, cache_stat;
+  GStatBuf path_stat, cache_stat;
   struct utimbuf utime_buf;
   GList *directories = NULL;
   int fd;